1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import NextAuth from "next-auth";
import { GET_CURRENT_USER } from "../../../queries";
import { client } from "../../../lib/apolloClient";
import crypto from "crypto";
import clientPromise from "../../../lib/mongodb";
import { MongoDBAdapter } from "@next-auth/mongodb-adapter";
const jwtSecret = crypto.randomBytes(64).toString("hex");
export const authOptions = {
// Configure one or more authentication providers
adapter: MongoDBAdapter(clientPromise),
providers: [
{
id: "AniListProvider",
name: "AniList",
type: "oauth",
token: "https://anilist.co/api/v2/oauth/token",
authorization: {
url: "https://anilist.co/api/v2/oauth/authorize",
params: { scope: "", response_type: "code" },
},
userinfo: {
url: process.env.GRAPHQL_ENDPOINT,
async request(context) {
const { data } = await client.query({
query: GET_CURRENT_USER,
context: {
headers: {
Authorization: "Bearer " + context.tokens.access_token,
},
},
});
return {
token: context.tokens.access_token,
name: data.Viewer.name,
sub: data.Viewer.id,
image: data.Viewer.avatar,
};
},
},
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
profile(profile) {
return {
token: profile.token,
id: profile.sub,
name: profile?.name,
image: profile.image,
};
},
},
],
secret: jwtSecret,
session: {
//Sets the session to use JSON Web Token
strategy: "jwt",
cookie: {
// Set the cookie to be secure and HTTP-only
secure: true,
httpOnly: true,
},
},
callbacks: {
async jwt({ token, user }) {
return { ...token, ...user };
},
async session({ session, token, user }) {
session.user = token;
return session;
},
},
};
export default NextAuth(authOptions);
|